移动推荐算法是阿里天池赛2015年赛题之一,题目以移动电商平台的真实用户-商品行为数据为基础来构建商品推荐模型。该题现已成为新人入门的经典演练对象,博主也希望基于该题场景,加深对机器学习相关知识的理解,积累实践经验。
题目回顾
关于题目和数据的介绍可访问天池官网中的:离线赛(移动推荐算法)-赛题与数据
业务场景
在真实的业务场景下,我们往往需要对所有商品的一个子集构建个性化推荐模型。在完成这件任务的过程中,我们不仅需要利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据。定义如下的符号:
U——用户集合
I——商品全集
P——商品子集,P ⊆ I
D——用户对商品全集的行为数据集合
那么我们的目标是利用 D 来构造 U 中用户对 P 中商品的推荐模型。
数据内容
本场比赛提供20000用户的完整行为数据以及百万级的商品信息。竞赛数据包含两个部分。第一部分是用户在商品全集上的移动端行为数据(D),表名为
tianchi_fresh_comp_train_user
,第二个部分是商品子集(P),表名为tianchi_fresh_comp_train_item
,两个数据集所包含的字段如下:D: tianchi_fresh_comp_train_user:
字段 字段说明 提取说明 user_id 用户标识 抽样&字段脱敏 item_id 商品标识 字段脱敏 behavior_type 用户对商品的行为类型 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4 user_geohash 用户位置的空间标识,可以为空 由经纬度通过保密的算法生成 item_category 商品分类标识 字段脱敏 time 行为时间 精确到小时级别 P: tianchi_fresh_comp_train_item:
字段 字段说明 提取说明 item_id 商品标识 抽样&字段脱敏 item_ geohash 商品位置的空间标识,可以为空 由经纬度通过保密的算法生成 item_category 商品分类标识 字段脱敏 训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D)。
评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。
赛题目标
参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。即预测12.19这一天用户在P上的购买情况。
参赛者完成用户对商品子集的购买预测之后,需要将结果放入指定格式的数据表(非分区表)中,要求结果表名为:
tianchi_mobile_recommendation_predict.csv
,且以utf-8格式编码;包含user_id
和item_id
两列(均为string类型),要求去除重复。例如:
结果评价
比赛采用经典的精确度(precision)、召回率(recall)和F1值作为评估指标。具体计算公式如下:
其中
PredictionSet
为算法预测的购买数据集合,ReferenceSet
为真实的答案购买数据集合。我们以F1值作为最终的唯一评测标准。
问题综述
采用前面一个月的用户-行为数据,预测在接下来的一天用户在指定商品子集上的购买情况。
数据解析
在得到数据后对数据进行初步分析认识是很有趣的。这里我们结合一些数据预处理和可视化的手段,对数据内涵进行初步挖掘。
规模和属性
数据规模
数据集文件fresh_comp_offline包含两个csv
文件,分别对应数据集D和P。其文件大小如下图示:
根据题目,我们将上述两个数据集分别即为 D 和 P 。
采用vim查看数据集文件内容,示意如下:
从上面的分析可以看到:D数据集包含2千多万条样本,文件大小约1G;P数据集包含60多万条记录,文件大小约10M。可以进一步测试数据全部加载所需时间,从而对数据量有个更直观的感受(这里采用python-pandas,查看测试代码)。结果显示,在我的计算机环境下,D数据集载入pandas-dataframe耗时约45s,P数据集载入耗时不到1s。(可以看到数据集的规模比较大,基于普通PC环境的分析处理可能会承受一定的压力,可考虑分块操作或抽样分析。)
属性特征
数据的属性已经在题目中给出,可以采用pandas查看部分数据如下图示:
数据集D
user_id item_id behavior_type user_geohash item_category time 0 10001082 285259775 1 97lk14c 4076 2014-12-08 18 1 10001082 4368907 1 NaN 5503 2014-12-12 12 2 10001082 4368907 1 NaN 5503 2014-12-12 12 3 10001082 53616768 1 NaN 9762 2014-12-02 15 4 10001082 151466952 1 NaN 5232 2014-12-12 11
数据集P
item_id item_geohash item_category 0 100002303 NaN 3368 1 100003592 NaN 7995 2 100006838 NaN 12630 3 100008089 NaN 7791 4 100012750 NaN 9614
其中数据集D包含6个属性,如代表不同用户的user_id,代表不同商品的item_id等;数据集P包含3个属性。下面列出一些基本的观点:
- 每一条样本对应于用户-行为记录,即
user_id - behaviour_type
,同时给出了对象item_id
和其他关联属性。 - 每个属性取值均可在不同的样本中出现。
宏观分析
点击购买转化率
我们的目标是预测购买事件的发生,在这样的业务背景下,我们先关注一下CTR指数(操作购买转化率),即用户购买商品与需要操作的次数的平均比率。通过pandas统计value_counts()
统计behavior_type
数据列可得:
CTR = 购买操作样本数 / 样本总数 = 232579 / 23291027 = 0.009986 ≈ 1%
即用户平均下来大约要进行100次操作(各种商品的点击查看、加购物车等行为),才会生成一次购买决定。
宏观行为统计
这里要按时间对数据进行一些可视化呈现,暂不考虑由“地理位置-时区”等因素,默认为统一的时间尺度。注意原始数据中的时间格式为%Y-%m-%d %H
,精确到小时,(python有许多成熟的软件包可完成对时间数据的高效处理)。这里主要基于pandas-matplotlib
进行可视化分析。一些图像如下:(查看可视化代码)
11月18-12月18,每日操作次数如图:
其中属于商品子集P的操作次数如图:
可以看到,除了“双12时期”记录猛增之外,总体稳定(没有反映“月光族”现象),进一步我们发现,不仅总操作数规模平稳,每类操作数也是平稳的。
下面考察两个假定的“平凡日”12月17日-18日,其各种操作(behavior_type
)基于小时记录的统计如下图示:
可见两天的变化趋势基本一致,并且可以看出一些符合实际的规律,比如每天记录的高峰期在晚上(人们较空闲),比如凌晨记录相对较少(都睡觉了),比如0号操作(点击浏览behavior_type=1
)比其他三种多得多等等。我们进一步查看3号
操作(购买behavior_type=1
)的统计如下图示:
可看到每天购买操作的变化趋势大体相同,同其他类型操作一致。
微观行为统计
首先考察用户微观信息,这里我们抽取一些用户,查看其操作(behavior_type
)的统计信息得到下表。
从表中可以看出这几个用户的信息,如10001082
的的CTR(操作购买转化率)高,且没有收藏和加购物车的习惯,看来很果断;如108461135
的操作次数多,可能成天逛手淘;111345634
购买次数很多,可能是购物狂等等。
然后考察商品微观信息,先查看数据集P,(由于P文件较小,可直接采用excel进行分析)。一些统计信息如下表示:
得出数据集P总计62万多件商品,分属于1054个商品类,其中最多的商品类4561
包括3万多件商品,最少的类别只有一件商品。
进一步地,我们还可以分析同一类商品的销售量,同一个用户的商品购买分布及对应的回头率等等更多内容。。。
本文小结
本文先是对“移动推荐算法”的题目进行了回顾,然后基于大量可视化的呈现对数据集进行了初步分析。至此,我们对所要分析的数据对象有了一个基本的轮廓认知,为进一步的数据挖掘工作做出了先验铺垫。